#coding=utf-8
from django.core.files.storage import Storage

from fdfs_client.client import Fdfs_client

from django.conf import settings


'''创建django与fdfs的链接，当运维上传图片时到调用'''
class FastDFSStorage(Storage):
# 自定义django存储系统的类

    def __init__(self, client_conf=None, server_ip=None):
        '''传入参数，解耦'''
        if client_conf is None:
            # 当外界没有传入client_conf时
            # client_conf = './client.conf'
            '''进一步解耦'''
            client_conf = settings.CLIENT_CONF

        # 当外界传入client_conf时
        self.client_conf = client_conf

        if server_ip is None:
            # server_ip = 'http://192.168.58.128:8888/'
            '''进一步解耦'''
            server_ip = settings.SERVER_IP

        self.server_ip = server_ip


    '''
    大致步骤：
    1.创建client对象, 参数是 client.conf
    2.调用client.upload_by_bffer(file)
    3.接受返回值,内部包含了file_id
    4.存储file_id

    代码：
    1. import fdfs_client.client module
    2. instantiate class Fdfs_client
    3. call memeber functions

    >>> from fdfs_client.client import *
    >>> client = Fdfs_client('/etc/fdfs/client.conf')
    >>> ret = client.upload_by_filename('test')
    >>> ret
    {'Group name':'group1','Status':'Upload successed.', 'Remote file_id':'group1/M00/00/00/
        wKjzh0_xaR63RExnAAAaDqbNk5E1398.py','Uploaded size':'6.0KB','Local file name':'test'
        , 'Storage IP':'192.168.243.133'}
    '''

    '''你的储存类必须实现 _open() 和 _save()方法
    以及任何适合于你的储存类的其它方法'''

    def _open(self, name, mode='rb'):
        # 打开文件时调用：这里我们只做存储，所以pass
        pass

    def _save(self, name, content):
        """存储文件时使用:参数2是上传来的文件名，参数3是上传来的File对象,提供read(),获取文件内容"""
        # content是File的对象，content.read()才是存储的内容

        # 创建fdfs对接的对象client
        # client = Fdfs_client('./client.conf')
        '''解耦'''
        client = Fdfs_client(self.client_conf)

        # 获取上传文件的内容
        file_data = content.read()
        # 调用上传的方法，并接受返回值
        try:
            ret = client.upload_by_buffer(file_data)
        except Exception as e:
            # 打印出异常方便自己调试
            print(e)
            raise

        # 判断是否上传成功
        if ret.get('Status') == 'Upload successed.':
            # 如果上传成功
            # 获取file_id
            file_id = ret.get('Remote file_id')

            # 返回给django存储file_id
            # 存储file_id:只需要返回file_id,我们的client,会自动的检测当前站点中正在使用的模型类,然后存储进去
            # 如果当前运维在操作GoodsSKU模型类,上传图片,那么return file_id,会自动存储到GoodsSKU模型类对应的数据库表中
            return file_id

        else:
            # 上传失败:抛出异常即可，开发工具类时，出现异常不要擅自处理，交给使用者处理
            raise Exception('上传文件到FastDFS失败')

    def exists(self, name):
        # 判断文件是否存储在了文件系统中，在这里只返回False，文件不在django文件系统中， 让django继续存储
        return False

    def url(self, name):
        # 返回保存文件的路径， name表示保存文件的路径
        # return 'http://192.168.58.128:8888/' + name
        '''解耦'''
        return self.server_ip + name
